/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Simplex;

import java.util.Scanner;

/**
 *
 * @author Alexandre
 * @author Guilherme
 * @autor Murillo
 */
public class Entrada {

    @SuppressWarnings("ManualArrayToCollectionCopy")

    /*
     * Lê as variáveis de entrada e cria o primeiro quadro
     */
    public void EntradaDeDados() {
        Scanner s = new Scanner(System.in);
        System.out.println("Informe n (x1,x2,...,xn), quantidade de variaveis:"); // n = quantidade de variáveis
        int c = s.nextInt(); // colunas da matriz
        System.out.println("Informe a quantidade total de equacoes:");
        int l = s.nextInt(); // linhas da matriz
        System.out.println("Entre com os dados na forma canonica");

        double entrada[][] = new double[l][c];
        String operador[] = new String[l]; //posição 0 não é usada
        double b[] = new double[l]; // posição 0 não é usada
        
        //entrada dos dados
        System.out.println("Informe a equacao a ser maximizada");
        for (int i = 0; i < c; i++) {
            if (i != 0) {
                System.out.print(" + ");
            }
            System.out.print("X" + i + " * ( ");
            entrada[0][i] = s.nextDouble();
            System.out.print(" ) ");
        }

        System.out.println("\nSujeito a:");
        for (int i = 1; i < l; i++) {
            for (int j = 0; j < c; j++) {
                if (j != 0) {
                    System.out.print(" + ");
                }
                System.out.print("X" + j + " * ( ");
                entrada[i][j] = s.nextDouble();
                System.out.print(" ) ");

            }
            System.out.println("\nInforme o operador ( < ou <= ):");
            operador[i] = s.next();
            System.out.println("Informe o valor b: ");
            b[i] = s.nextDouble();
        }

        /*//Entrada de teste
         entrada[0][0] = 1;
         entrada[0][1] = 2;
         entrada[1][0] = 1;
         entrada[1][1] = 0;
         entrada[2][0] = 0;
         entrada[2][1] = 1;
         entrada[3][0] = 1;
         entrada[3][1] = 1;
         operador[1] = "<=";
         operador[2] = "<=";
         operador[3] = "<=";
         b[0] = 0;
         b[1] = 3;
         b[2] = 4;
         b[3] = 9;*/
        
        //Imprimindo a entrada
        for (int i = 0; i < l; i++) {
            if (i == 0) {
                System.out.print("\nMax Z = ");
            }else{
                if(i == 1){
                    System.out.println("Sujeito a:");
                }
            }
            for (int j = 0; j < c; j++) {
                if (j != 0) {
                    System.out.print(" + ");
                }
                System.out.print("(" + entrada[i][j] + ") * X" + j);
            }
            if (i > 0) {
                System.out.print(" " + operador[i] + " " + b[i]);
            }
            System.out.println("");
        }

        int cont = 0; //conta a quantidade de variáveis de folga
        //calculando a quantidade de váriaveis de folga
        for (int i = 1; i < l; i++) {
            if (operador[i].equals("<=") || operador[i].equals("<")) {
                ++cont;
            } else {
                System.out.println("Erro! Não entrou com os dados na forma canonica");
                System.exit(1); //Não entrou na forma canônica, aborta
            }
        }

        //Montando a base
        Main.base = new int[cont];
        Main.sizeBase = cont; // quantidade de variáveis na base
        for (int i = 0; i < cont; i++) {
            Main.base[i] = c + i;
        }

        int colunas = c + cont + 1; //nova quantidade de colunas, +1 poque a base vai entrar na matriz também
        //criando a matriz na forma padrão 
        double matriz[][] = new double[l][colunas];

        //copia os dados da entrada
        for (int i = 0; i < l; i++) {
            for (int j = 0; j < c; j++) {
                matriz[i][j] = entrada[i][j];
            }
        }

        //Zerando todas as váriaveis de folga
        for (int i = 0; i < l; i++) {
            for (int j = c; j < colunas; j++) {
                matriz[i][j] = 0;
            }
        }

        int aux = -1; // armazena a coluna da última linha que recebeu uma variável de folga
        //Encontrando a posição das variaveis de folga
        for (int i = 1; i < l; i++) {
            for (int j = c; j < colunas; j++) {
                if ((operador[i].equals("<=") || operador[i].equals("<")) && j > aux) {
                    matriz[i][j] = 1;
                    aux = j; // última coluna que recebeu variável de folga
                    break;
                }
            }
        }

        //Copiando a coluna base para a matriz
        for (int i = 1; i < l; i++) {
            matriz[i][colunas - 1] = b[i];
        }

        //Como é maximização, altera os sinais da linha base
        for (int i = 0; i < colunas; i++) {
            matriz[0][i] *= -1;
        }

        Main.colunas = colunas; //seta a quantidade de colunas
        Main.linhas = l; //seta a quantidade de linhas
        Main.Matriz = matriz; //Faz a matriz estática receber a matriz montada
    }
}
